iT邦幫忙

2023 iThome 鐵人賽

DAY 9
0
Cloud Native

AWS AI交易室實戰系列 第 9

Day 9 - 一天搞定 Docker

  • 分享至 

  • xImage
  •  

~ 急急忙忙搞定 Docker 概念~
Docker concept
Docker containers vs virtual machines. Source: Wikipedia

相關程式碼:https://github.com/slindevel/modern-aws-marathon

對於資訊從業人員來說,如果是稍微熱衷技術的,肯定會把 Docker 作為開發最重要的工具之一,不過還是有不在少數一群人,對於 Docker 還是停留在只聽聞過的階段,希望通過一天的解說可以讓更多人享受到這個工具的便利。

我們說因為電腦科技演進,虛擬機技術可以在一台電腦上啟動多個作業系統(OS,Operating System),不過不論是啟動 Windows 或是 Linux 都需要一定的時間(~ 3min),虛擬化技術的目的是可以利用閒置的資源執行任務,以節省成本同時也方便管理,現在如果我們每一台虛擬機都是啟動 Linux 系統,那是不是有很多重複的部分需要被載入好幾次呢?Docker 就是將這些共用層統一管理的技術,把共用的部分統一管理,不同的部分獨立開來,切出一個個獨立的應用程式的獨立檔案空間以及執行環境這個獨立的執行空間我們稱做「容器」(Container),對應到一個個的虛擬機(VM,Virtual Machine),Docker 技術可以做到執行 Container 程式 與 在 Host OS 執行程式的效能相差無幾,且讓我們更易於管理複雜的應用程式環境了,有助於整體效率的提升。

Docker 包括三個基本概念
映像檔(Image) - 映像檔是一個唯讀的模板,映像檔可以用來建立容器。
容器(Container) - 容器執行應用。映像檔是唯讀的,容器在啟動的時候建立一層可寫層作為最上層。
倉庫(Repository) - 倉庫是集中存放映像檔檔案的場所。

我們直接通過幾個指令感受一下 Docker 的基本概念吧

  • 確定 Docker 服務 & 確認版本
$ docker -v
Docker version 20.10.24, build 297e128
  • 搜尋 docker ubuntu:22.04 映像檔,預設的 Docker 倉庫是 Docker Hub ,我們有指定特定版本(22.04)安裝,不過 docker 本身指令並沒有支援搜尋版本(tags),使用 docker search 只能列出含有關鍵字的 repository,上網搜尋把人家寫好的 shell script 直接拿來用(docker_search.sh)
    接著我們使用 docker pull 把它抓取下來,接著使用 docker images 查詢
# Day11/docer_search.sh
$ ./docker_search.sh ubuntu | grep 22.04
ubuntu:22.04
$ docker pull ubuntu:22.04
$ docker images| grep ubuntu
ubuntu                                                                                        22.04                          6a47e077731f   2 weeks ago     69.2MB
  • 然後我們可以下指令執行容器,並且進入容器,可以看到裡面有他自己獨立的一套檔案系統
$ docker run -it ubuntu:22.04 /bin/bash
root@08e6df1bba9b:/# pwd
/
root@08e6df1bba9b:/# ls
bin  boot  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
  • 接著我們試著讓 Container 以背景程式方式執行,docker ps 查詢可以看到 container 正在執行當中
$ docker run -itd ubuntu:22.04 /bin/bash
$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                               NAMES
fd0e6cbefcea   ubuntu:22.04   "/bin/bash"              26 seconds ago   Up 24 seconds                                       ecstatic_fermat
  • 使用 docker stop <container_id>,停止 Container,再 docker ps 一次,程序已經被終止,被終止的 container 不代表被移除,再下一次指令 docker ps -a 觀察剛剛啟動的 container 還在,不過狀態是 Exited(0),必須先使用 docker container rm 移除 container 再移除 image 以節省空間,這邊如果尚有使用此 image 的 container 則會報錯
$ docker stop fd0e6cbefcea
fd0e6cbefcea
$ docker container rm fd0e6cbefcea
$ docker container prune
$ docker ps -a | grep ubuntu:22.04 
CONTAINER ID   IMAGE     COMMAND                  CREATED        STATUS       PORTS                               NAMES
$ docker rmi ubuntu:22.04

Dockerfile

Dockerfile 是一個用來建構映像檔的文件,內容遵照既定的格式撰寫,包含了一行行指令以及註解

一個簡單的 python Dockerfile,其中 main.py 是一個 Flask 應用程式,會監聽 8888 port 並回應 Dockerized Marathon 訊息,需要檔案結構如下:

Day9
.
├── Dockerfile
├── docker_search.sh
├── main.py
└── requirements.txt
# Day11/Dockerfile
FROM python:3.7-alpine
WORKDIR /app
ADD . /app
RUN pip install -r requirements.txt
CMD python main.py

使用指令 docker build --platform=linux/amd64 -t marathon-dockerfile:latest . 建構,

注意這邊使用了--platform=linux/amd64 是因為筆者是使用 M1 Macbook docker預設指令會帶入

--platform=linux/arm64 很多 docker hub 上的 image 不支援會抓不到 image,習慣上 docker build、docker run 都會加上這個參數。

然後使用指令跑起來,在瀏覽器上打 http://127.0.0.1 就可以看到訊息了

$ docker run -d -p 80:8888 \
--platform=linux/amd64 \
--name marathon-container marathon-dockerfile

Docker 的概念至關重要,往後幾天會常常用到這些指令 & Dockerfile
今天簡單地帶可能還是新手的人可以很快上手 & 一起感受一下這個工具的強大

參考資料:

https://www.guru99.com/docker-tutorial.html
https://docker-curriculum.com/#introduction
https://www.sitecore.com/knowledge-center/getting-started/docker-a-quick-overview
https://www.freecodecamp.org/news/a-beginner-friendly-introduction-to-containers-vms-and-docker-79a9e3e119b/


上一篇
Day 8 - Lambda Best Practices
下一篇
Day 10 - 使用 Lambda Layer 部署 Python Packages
系列文
AWS AI交易室實戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言